﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Threading.Tasks;
using Dapper;
using orz.mouxianyu.Models;

namespace orz.mouxianyu.Services.lmpl
{
    public class TestService : ITestService
    {
        //声明SqlConnection
        private SqlConnection _connection;
        private SqlTransaction _stran;

        public TestService(SqlConnection sqlConn)
        {
            //注入SqlConnection
            this._connection = sqlConn;
        }

        /// <summary>
        /// 测试业务1
        /// </summary>
        /// <param name="flag">标记</param>
        /// <returns></returns>
        public Test1 test(int number)
        {
            try
            {
                Test1 re = new Test1();
                re.remsg = "您输入了数字：" + number;
                return re;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
            }
        }

        /// <summary>
        /// 数据库连接测试
        /// </summary>
        /// <returns></returns>
        public IEnumerable<TestSqlDTO> TestSql()
        {
            // IEnumerable<T>为数据集合，若返回类型不为集合，则无需添加，这里为做演示写的返回类型是集合，如果不为集合，直接写返回模型就行了，如：public TestSqlDTO TestSql(){}
            try
            {
                //打开连接池
                _connection.Open();
                //sql查询语句
                string sql = "select '测试数据' as testNumber,'测试内容' as testValues";
                //以下三个_stran开头的是用来处理多表操作时部分操作成功部分操作失败导致的信息不对称问题，若sql语句或存储过程不涉及多表的增删改，则无需添加
                //_stran = _connection.BeginTransaction();
                //_stran.Commit();
                //返回查询结果
                return _connection.Query<TestSqlDTO>(sql);
                //注：若返回结果不为集合，需要在最后面添加.SingleOrDefault();若使用存储过程，需要在里面添加transaction: _stran, commandType: CommandType.StoredProcedure
                //若需要传参，请使用new{}
                //以下为示例代码，详情参见Query<T>()方法的+2多个重载
                //_connection.Query<TestSqlDTO>("存储过程名",new {参数1，参数2，……，参数N},transaction: _stran, commandType: CommandType.StoredProcedure).SingleOrDefault();
            }
            catch (Exception ex)
            {
                //_stran.Rollback();
                throw ex;
            }
            finally
            {
                //关闭连接
                _connection.Close();
            }
        }
    }
}
